﻿// 302 括号序列.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <map>
#include <string.h>
#include <string>

using namespace std;
/*
http://oj.daimayuan.top/course/5/problem/200

给定一个长度为 n的字符串 s
，字符串由 (, ), [, ] 组成，问其中最长的合法子序列有多长？也就是说，我们要找到最大的 m
，使得存在 i1,i2,…,im满足 1≤i1<i2<⋯<im≤n并且 si1si2…sim是一个合法的括号序列。

合法的括号序列的定义是：

空串是一个合法的括号序列。

若 A 是一个合法的括号序列，则 (A), [A] 也是合法的括号序列。

若 A, B 都是合法的括号序列，则 AB 也是合法的括号序列。

输入格式
第一行一个整数 n。

接下来一行，一个长度为 n的字符串 s。

输出格式
一个数，表示答案。

样例输入
10
]]][()]])[
样例输出
4

数据规模
对于所有数据，保证 1≤n≤500。
*/


int n, dp[510][510];
string s;

int main() {
	cin >> n >> s;
	s.insert(s.begin(),'#');

	for (int len = 1; len <= n; len++) {
		for (int i = 1; i <= n; i++) {
			int r = i + len;
			if (r > n) break;
			//if (s[i] == '(' && s[r] == ')' && len ==1) { dp[i][r] = 2; }
			//if (s[i] == '[' && s[r] == ']' && len == 1) { dp[i][r] = 2; }
			/*if (s[i] == '(' && s[r] == ')' && len >1 ) { dp[i][r] = dp[i+1][r-1]+2; }
			if (s[i] == '[' && s[r] == ']' && len > 1) { dp[i][r] = dp[i + 1][r - 1] + 2; }*/
			if (s[i] == '(' && s[r] == ')' ) { dp[i][r] = dp[i+1][r-1]+2; }
			if (s[i] == '[' && s[r] == ']' ) { dp[i][r] = dp[i + 1][r - 1] + 2; }
			for (int k = i; k < r; k++) {
				dp[i][r] = max(dp[i][r], dp[i][k] + dp[k + 1][r]);
			}
		}
	}

	cout << dp[1][n] << endl;
}